package br.com.truta.bd.dao;

import static br.com.truta.bd.DBUtils.close;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.truta.bd.ConnectionFactory;
import br.com.truta.bd.DaoException;
import br.com.truta.model.Usuario;
import br.com.truta.util.Constantes;

public class UsuarioDAO {
	private UsuarioDAO() {
		super();
	}
	
	public static List<Usuario> buscaUsuarioNome(String nomeUsuario) throws DaoException {
		PreparedStatement stmt = null;
		Connection con = null;
		ResultSet rs = null;
		List<Usuario> listaUsuario = new ArrayList<Usuario>();

		try {
			Usuario usuario = null;

			// faz a conexao com o BD
			con = ConnectionFactory.getLocalMySQLConnection();
			stmt = con.prepareStatement(Constantes.SQL_SELECT_USUARIO_NOME);
			stmt.setString(1, "%" + nomeUsuario + "%");

			rs = stmt.executeQuery();

			while (rs.next()) {
				usuario = new Usuario();
				usuario.setId(rs.getInt("ID"));
				usuario.setUsuario(rs.getString("USUARIO"));
				usuario.setSenha(rs.getString("SENHA"));
				usuario.setNome(rs.getString("NOME"));
				usuario.setSobrenome(rs.getString("SOBRENOME"));
				usuario.setEmail(rs.getString("EMAIL"));
				
				listaUsuario.add(usuario);
			}

		} catch (Exception e) {
			throw new DaoException("Erro ao buscaUsuarioNome.", e);
		} finally {
			close(rs, stmt, con);
		}
		
		return listaUsuario;
	}
	
	public static Usuario buscaUsuarioUserName(String userNome) throws DaoException {
		PreparedStatement stmt = null;
		Connection con = null;
		ResultSet rs = null;

		Usuario usuario = null;

		try {

			// faz a conexao com o BD
			con = ConnectionFactory.getLocalMySQLConnection();
			stmt = con.prepareStatement(Constantes.SQL_SELECT_USUARIO_USERNAME);
			stmt.setString(1, userNome);

			rs = stmt.executeQuery();

			while (rs.next()) {
				usuario = new Usuario();
				usuario.setId(rs.getInt("ID"));
				usuario.setUsuario(rs.getString("USUARIO"));
				usuario.setSenha(rs.getString("SENHA"));
				usuario.setNome(rs.getString("NOME"));
				usuario.setSobrenome(rs.getString("SOBRENOME"));
				
			}

		} catch (Exception e) {
			throw new DaoException("Erro ao buscaUsuarioId.", e);
		} finally {
			close(rs, stmt, con);
		}
		
		return usuario;
	}
	
	public static Usuario buscaUsuarioId(int idUsuario) throws DaoException {
		PreparedStatement stmt = null;
		Connection con = null;
		ResultSet rs = null;

		Usuario usuario = null;

		try {

			// faz a conexao com o BD
			con = ConnectionFactory.getLocalMySQLConnection();
			stmt = con.prepareStatement(Constantes.SQL_SELECT_USUARIO_ID);
			stmt.setInt(1, idUsuario);

			rs = stmt.executeQuery();

			while (rs.next()) {
				usuario = new Usuario();
				usuario.setId(rs.getInt("ID"));
				usuario.setUsuario(rs.getString("USUARIO"));
				usuario.setSenha(rs.getString("SENHA"));
				usuario.setNome(rs.getString("NOME"));
				usuario.setSobrenome(rs.getString("SOBRENOME"));
				
			}

		} catch (Exception e) {
			throw new DaoException("Erro ao buscaUsuarioId.", e);
		} finally {
			close(rs, stmt, con);
		}
		
		return usuario;
	}

	public static boolean insereUsuario(Usuario person) throws DaoException {
		PreparedStatement stmt = null;
		Connection con = null;
		boolean retorno = false;
		
		try {
			// Abre conexao com o BD User
			con = ConnectionFactory.getLocalMySQLConnection();
			
			//Prepara o Statement
			stmt = con.prepareStatement(Constantes.SQL_INSET_USUARIO);
			
			//usuario, senha, nome, sobrenome, email
			stmt.setString(1, person.getUsuario());
			stmt.setString(2, person.getSenha());
			stmt.setString(3, person.getNome());
			stmt.setString(4, person.getSobrenome());
			stmt.setString(5, person.getEmail());

			stmt.executeUpdate();
			
			retorno = true;
		}catch (Exception e) {
			retorno = false;
			throw new DaoException("Erro ao insertUsuario", e);
		} finally {
			close(stmt, con);
		}
		return retorno;
	}

	public static boolean validaLogin(String user, String password) throws DaoException {
		PreparedStatement stmt = null;
		Connection con = null;
		ResultSet rs = null;

		boolean retorno = false;

		try {

			// faz a conexao com o BD
			con = ConnectionFactory.getLocalMySQLConnection();
			stmt = con.prepareStatement(Constantes.SQL_SELECT_USUARIO_USER_SENHA);
			stmt.setString(1, user);
			stmt.setString(2, password);

			rs = stmt.executeQuery();

			while (rs.next()) {
				retorno = true;
				break;
			}

		} catch (Exception e) {
			throw new DaoException("Erro ao buscaUsuarioId.", e);
		} finally {
			close(rs, stmt, con);
		}
		
		return retorno;
	}
	
	public static boolean validaLogin(String user) throws DaoException {
		PreparedStatement stmt = null;
		Connection con = null;
		ResultSet rs = null;

		boolean retorno = false;

		try {

			// faz a conexao com o BD
			con = ConnectionFactory.getLocalMySQLConnection();
			stmt = con.prepareStatement(Constantes.SQL_SELECT_USUARIO_USERNAME);
			stmt.setString(1, user);

			rs = stmt.executeQuery();

			while (rs.next()) {
				retorno = true;
				break;
			}

		} catch (Exception e) {
			throw new DaoException("Erro ao buscaUsuarioId.", e);
		} finally {
			close(rs, stmt, con);
		}
		
		return retorno;
	}
	
	public static boolean validaEmail(String email) throws DaoException {
		PreparedStatement stmt = null;
		Connection con = null;
		ResultSet rs = null;

		boolean retorno = false;

		try {

			// faz a conexao com o BD
			con = ConnectionFactory.getLocalMySQLConnection();
			stmt = con.prepareStatement(Constantes.SQL_SELECT_USUARIO_EMAIL);
			stmt.setString(1, email);

			rs = stmt.executeQuery();

			while (rs.next()) {
				retorno = true;
				break;
			}

		} catch (Exception e) {
			throw new DaoException("Erro ao buscaUsuarioId.", e);
		} finally {
			close(rs, stmt, con);
		}
		
		return retorno;
	}
}
